package com.sunl.mall.ali.mq.consumer;

import java.util.concurrent.ConcurrentHashMap;

/**
 * 订阅关系一致性校验
 * 检查同一个JVM下是否存在同一个GROUP_ID(ConsumerId)被创建多个{@link RocketMqConsumerBean}
 * || {@link RocketMqOrderConsumerBean}|| {@link RocketMqBatchConsumerBean}，
 * 如果被创建了多个则可能出现consumer实例被滥用的情况，从而导致同一个GID下订阅关系不一致。
 * 例如：JVM1下利用GID1创建了实例Consumer1，订阅了Topic1，Topic2，同时利用GID1创建了实例Consumer2，订阅了Topic3，Topic4，这时就出现了订阅关系不一致。
 * <p>
 * 此外在多个JVM中使用同一个GID创建的Consumer实例订阅了不同的Topic或Tag导致的订阅关系不一致情况这里是避免不了的，只能在阿里云控制台检出并处理。
 */
public interface SubscriptionRelationChecker {
    /**
     * 共享容器，用来存储当前jvm中已经被使用的消费者组
     */
    ConcurrentHashMap<String, Boolean> CONSUMER_GROUP_IDS = new ConcurrentHashMap<>();

    /**
     * @param groupId consumer gid
     * @throws IllegalArgumentException exception
     */
    default void check(String groupId) throws IllegalArgumentException {
        if (CONSUMER_GROUP_IDS.putIfAbsent(groupId, true) != null) {
            throw new IllegalArgumentException("GroupId:" + groupId + " 订阅关系不一致（当前Consumer GroupId被创建了多个实例）");
        }
    }
}
